// 引入axios的核心库以及封装好的数据类型验证
import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'
//引入封装好的接口类型
import { ResultData } from './interface/index'
import qs from 'querystring'

//配置项内容 当做形参去接收
let config = {
    // baseURL: '/api'
}
//定义一个类 封装方法以及拦截器
class Http {
    http: AxiosInstance
    //类的作用域是this 强制让config去符合AxiosRequestConfig的数据类型和请求配置项
    constructor(config: AxiosRequestConfig) {
        //重新实例化 创建一个axios
        this.http = axios.create(config)
        //请求拦截器
        this.http.interceptors.request.use((req) => {
            // if (req.url != 'userlogin') {
            //     req.headers.authorization = sessionStorage.getItem('userInfo') ? JSON.parse(sessionStorage.getItem('userInfo') as any).token : null
            // }
            return req
        })
        //响应拦截器
        this.http.interceptors.response.use((res) => {
            return res.data
        })
    }
    //添加方法
    get<T>(url: string, params?: Object): Promise<ResultData> {//get不确定的类型，泛型(调用时决定类型)
        return this.http.get(url, {
            params
        })
    }
    post<T>(url: string, params?: any, isFile: boolean = false): Promise<ResultData> {
        let data: any = {}
        if (isFile) {
            data = new FormData()
            //TS中不支持for in  Object.entries对象变可枚举类型
            for (const [key, val] of Object.entries(params)) {
                data.append(key, val)
            }
        } else {
            data = qs.stringify(params)
        }
        return this.http.post(url, data)
    }
}
//导出实例化类
export default new Http(config)